
#include <linux/module.h>		
#include <linux/init.h>		



#include <linux/moduleparam.h>

/*
  insmod的时候向模块传递参数


  modinfo 查看描述信息，

  root@SOM-RK3399v2:/drv_code# modinfo 05_module_param.ko 
  filename: 	  /drv_code/05_module_param.ko
  alias:		  alias xxx
  description:	  module test
  author:		  aston
  license:		  GPL
  srcversion:	  3BF5315A7467F808537EA99
  depends:		  
  vermagic: 	  4.4.1792025-10-14-xyd SMP mod_unload modversions aarch64
  parm: 		  a:e.g.a=1 (int)
  parm: 		  array:e.g.array=1,2,3 (array of int)
  parm: 		  str:e.g.str=hello (string)

  测试：insmod    05_module_param.ko a=1 array=1,2 str=abc

  执行：
  root@SOM-RK3399v2:/drv_code# insmod 05_module_param.ko 
  [13039.437463] chrdev_init helloworld exit
  [13039.437864] a	is 0
  [13039.438071] array_size is 0
  [13039.438337] str1 is 
  

  */

// 传递int 
static int a = 0; 
//参数a    参数类型    参数权限,  S_IRUGO=444 所有用户可读
module_param(a, int, S_IRUGO);
//对a进行描述，在查看描述信息，知道如何给a传递值
MODULE_PARM_DESC(a, "e.g.a=1");


// 传递array 
static int array[5]={0};
//数组大小，自动到命令行中去获取数组大小
static int array_size;
module_param_array(array, int, &array_size,S_IRUGO);
MODULE_PARM_DESC(array, "e.g.array=1,2,3");


//传递字符串

static char str1[10]={0};
module_param_string(str, str1, sizeof(str1), S_IRUGO);
MODULE_PARM_DESC(str, "e.g.str=hello");





static int __init chrdev_init(void)
{	
     int i=0;
	 printk(KERN_INFO "chrdev_init helloworld exit\n");

     printk(KERN_INFO "a  is %d\n",a);

	 for(i=0;i<array_size;i++){
          printk(KERN_INFO "array[%d] is %d\n",i,array[i]);    
	 }
	 printk(KERN_INFO "array_size is %d\n",array_size);

	 printk(KERN_INFO "str1 is %s\n",str1);

	  return 0;
}



static void __exit chrdev_exit(void)
{
	printk(KERN_INFO "chrdev_exit helloworld exit\n");

 
}


module_init(chrdev_init);
module_exit(chrdev_exit);

// MODULE_xxx这种宏作用是用来添加模块描述信息
MODULE_LICENSE("GPL");				// linux 内核是开源的，你自己的模块也要GPL, 否则调用内核出现莫名奇妙错误有可能
MODULE_AUTHOR("aston");				// 描述模块的作者
MODULE_DESCRIPTION("module test");	// 描述模块的介绍信息
MODULE_ALIAS("alias xxx");			// 描述模块的别名信息








